#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#include <WiFi.h>
#include <esp_now.h>
#include <MAC_address.h>

// 设置掌控板声音传感器与光线传感器引脚编号
const int soundPin = 36;
const int lightPin = 39;

// 设置数据结构体
typedef struct struct_message
{
	String board_name;
	double light;
	double sound;
} struct_message;

struct_message myData;

// 接收设备的 MAC 地址
uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0x88, 0x62, 0x80};

// 数据发送回调函数
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
{
	char macStr[18];
	Serial.print("Packet to: ");
	snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
			 mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
	Serial.println(macStr);
	Serial.print("Send status: ");
	Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
	Serial.println();
}

void setup()
{
	//将字符数组中存储的MAC地址转化为16进制数组中存储的数据,这样通过修改编号就可以决定与那个板子进行通讯
	mac_str_to_bin(address[1], broadcastAddress);
	Serial.begin(115200);
	pinMode(lightPin, INPUT);
	pinMode(soundPin, INPUT);
	// 初始化 ESP-NOW
	WiFi.mode(WIFI_STA);
	if (esp_now_init() != ESP_OK)
	{
		Serial.println("Error initializing ESP-NOW");
		return;
	}

	// 设置发送数据回调函数
	esp_now_register_send_cb(OnDataSent);

	// 绑定数据接收端
	esp_now_peer_info_t peerInfo;
	memcpy(peerInfo.peer_addr, broadcastAddress, 6);
	peerInfo.channel = 0;
	peerInfo.encrypt = false;

	// 检查设备是否配对成功
	if (esp_now_add_peer(&peerInfo) != ESP_OK)
	{
		Serial.println("Failed to add peer");
		return;
	}
}

void loop()
{
	// 设置要发送的数据
	myData.board_name = "mPython_#1";
	myData.light = analogRead(lightPin);
	myData.sound = analogRead(soundPin);

	// 发送数据
	esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));

	// 检查数据是否发送成功
	if (result == ESP_OK)
	{
		Serial.println("Sent with success");
	}
	else
	{
		Serial.println("Error sending the data");
	}
	delay(10);
}
// 该例子演示的是将其中一块 ESP32 开发板（此处以掌控板为例）检测到的数据发送给另一块 ESP32 开发板。
// 首先在开头引入了 ESP-NOW 相关的头文件：WiFi.h 与 esp_now.h。然后定义了传感器的引脚和一个名为 myData 的结构体，该结构体由 3 个不同数据组成，分别是开发板名称（board_name），光线值（light）与声音值（sound），其中开发板名称为字符串类型，光线值与声音值为浮点型数据。若我们同时有多个传感器数据检测端，可以通开发板名称来区分来自设备的数据。
// 接着用uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0x88, 0x62, 0x80} 定义了接收设备的 MAC 地址。
// 除此之外，我们注册了一个 OnDataSent() 的数据发送回调函数，该函数反馈了 ESP-NOW 数据的发送状态，该例子每隔一秒将光线值和声音值发送到指定 MAC 地址的开发板。
// 在 setup() 中，我们先是初始化了 ESP-NOW 相关的功能，然后设置了发送数据的回调函数、以及绑定了数据接收端的 MAC 地址。
// 在 loop() 中，我们不断读取光线值和声音值，并将他们赋值给 myData 结构体，然后将它们发送到接收端，并且去判断数据是否发送成功。
